{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pytorch Tutorial"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Following DATAI guide (https://www.kaggle.com/kanncaa1/pytorch-tutorial-for-deep-learning-lovers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['train.csv', 'sample_submission.csv', 'test.csv']\n"
     ]
    }
   ],
   "source": [
    "# This Python 3 environment comes with many helpful analytics libraries installed\n",
    "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
    "# For example, here's several helpful packages to load in \n",
    "\n",
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
    "\n",
    "# Input data files are available in the \"../input/\" directory.\n",
    "# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n",
    "\n",
    "import os\n",
    "print(os.listdir(\"../input\"))\n",
    "\n",
    "# Any results you write to the current directory are saved as output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.autograd import Variable\n",
    "import torchvision.transforms as transforms\n",
    "import torch.nn as nn \n",
    "from sklearn.model_selection import train_test_split\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Simple Linear Regression Example using Pytorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
    "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "house_price_k = [300,450,500,670,730,858,912,1000,1200]\n",
    "house_price_k = np.array(house_price_k,dtype=np.float32)\n",
    "# Normalize data to prevent inf loss\n",
    "house_price_k = house_price_k/house_price_k.max(axis=0)\n",
    "house_price_k = house_price_k.reshape(-1,1)\n",
    "house_price_k = Variable(torch.from_numpy(house_price_k))\n",
    "\n",
    "houses_sold = [150,70,66,60,55,55,45,30,1]\n",
    "houses_sold = np.array(houses_sold,dtype=np.float32)\n",
    "# Normalize data to prevent inf loss\n",
    "houses_sold = houses_sold/houses_sold.max(axis=0)\n",
    "houses_sold = houses_sold.reshape(-1,1)\n",
    "houses_sold = Variable(torch.from_numpy(houses_sold))\n",
    "\n",
    "plt.scatter(house_price_k,houses_sold)\n",
    "plt.xlabel(\"House prices in £1000 (normalized)\")\n",
    "plt.ylabel(\"Number of houses sold at that price\")\n",
    "plt.title(\"House Price VS Number of Houses sold\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0, loss 1.5299993753433228\n",
      "epoch 150, loss 0.013502690009772778\n",
      "epoch 300, loss 0.013489937409758568\n",
      "epoch 450, loss 0.013489938341081142\n",
      "epoch 600, loss 0.013489934615790844\n",
      "epoch 750, loss 0.013489934615790844\n",
      "epoch 900, loss 0.013489934615790844\n",
      "epoch 1050, loss 0.013489934615790844\n",
      "epoch 1200, loss 0.013489934615790844\n",
      "epoch 1350, loss 0.013489934615790844\n",
      "epoch 1500, loss 0.013489934615790844\n",
      "epoch 1650, loss 0.013489934615790844\n",
      "epoch 1800, loss 0.013489934615790844\n",
      "epoch 1950, loss 0.013489934615790844\n",
      "epoch 2100, loss 0.013489934615790844\n",
      "epoch 2250, loss 0.013489934615790844\n",
      "epoch 2400, loss 0.013489934615790844\n",
      "epoch 2550, loss 0.013489934615790844\n",
      "epoch 2700, loss 0.013489934615790844\n",
      "epoch 2850, loss 0.013489934615790844\n",
      "epoch 3000, loss 0.013489934615790844\n",
      "epoch 3150, loss 0.013489934615790844\n",
      "epoch 3300, loss 0.013489934615790844\n",
      "epoch 3450, loss 0.013489934615790844\n",
      "epoch 3600, loss 0.013489934615790844\n",
      "epoch 3750, loss 0.013489934615790844\n",
      "epoch 3900, loss 0.013489934615790844\n",
      "epoch 4050, loss 0.013489934615790844\n",
      "epoch 4200, loss 0.013489934615790844\n",
      "epoch 4350, loss 0.013489934615790844\n",
      "epoch 4500, loss 0.013489934615790844\n",
      "epoch 4650, loss 0.013489934615790844\n",
      "epoch 4800, loss 0.013489934615790844\n",
      "epoch 4950, loss 0.013489934615790844\n",
      "epoch 5100, loss 0.013489934615790844\n",
      "epoch 5250, loss 0.013489934615790844\n",
      "epoch 5400, loss 0.013489934615790844\n",
      "epoch 5550, loss 0.013489934615790844\n",
      "epoch 5700, loss 0.013489934615790844\n",
      "epoch 5850, loss 0.013489934615790844\n",
      "epoch 6000, loss 0.013489934615790844\n",
      "epoch 6150, loss 0.013489934615790844\n",
      "epoch 6300, loss 0.013489934615790844\n",
      "epoch 6450, loss 0.013489934615790844\n",
      "epoch 6600, loss 0.013489934615790844\n",
      "epoch 6750, loss 0.013489934615790844\n",
      "epoch 6900, loss 0.013489934615790844\n",
      "epoch 7050, loss 0.013489934615790844\n",
      "epoch 7200, loss 0.013489934615790844\n",
      "epoch 7350, loss 0.013489934615790844\n",
      "epoch 7500, loss 0.013489934615790844\n",
      "epoch 7650, loss 0.013489934615790844\n",
      "epoch 7800, loss 0.013489934615790844\n",
      "epoch 7950, loss 0.013489934615790844\n",
      "epoch 8100, loss 0.013489934615790844\n",
      "epoch 8250, loss 0.013489934615790844\n",
      "epoch 8400, loss 0.013489934615790844\n",
      "epoch 8550, loss 0.013489934615790844\n",
      "epoch 8700, loss 0.013489934615790844\n",
      "epoch 8850, loss 0.013489934615790844\n",
      "epoch 9000, loss 0.013489934615790844\n",
      "epoch 9150, loss 0.013489934615790844\n",
      "epoch 9300, loss 0.013489934615790844\n",
      "epoch 9450, loss 0.013489934615790844\n",
      "epoch 9600, loss 0.013489934615790844\n",
      "epoch 9750, loss 0.013489934615790844\n",
      "epoch 9900, loss 0.013489934615790844\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "class LinearRegression(nn.Module):\n",
    "    def __init__(self,input_size,output_size):\n",
    "        # super function. It inherits from nn.Module and \n",
    "        # we can access everything in nn.Module\n",
    "        super(LinearRegression,self).__init__()\n",
    "        # Linear function.\n",
    "        self.linear = nn.Linear(input_dim,output_dim)\n",
    "\n",
    "    def forward(self,x):\n",
    "        return self.linear(x)\n",
    "    \n",
    "# define model\n",
    "input_dim = 1\n",
    "output_dim = 1\n",
    "model = LinearRegression(input_dim,output_dim) # input and output size are 1\n",
    "\n",
    "# MSE\n",
    "mse = nn.MSELoss()\n",
    "\n",
    "# Optimization (find parameters that minimize error)\n",
    "learning_rate = 0.4  # how fast we reach best parameters\n",
    "optimizer = torch.optim.SGD(model.parameters(),lr = learning_rate)\n",
    "\n",
    "# train model\n",
    "loss_list = []\n",
    "iteration_number = 10000\n",
    "for iteration in range(iteration_number):\n",
    "        \n",
    "    # optimization\n",
    "    optimizer.zero_grad() \n",
    "    \n",
    "    # Forward to get output\n",
    "    results = model(house_price_k)\n",
    "    \n",
    "    # Calculate Loss\n",
    "    loss = mse(results, houses_sold)\n",
    "    \n",
    "    # backward propagation\n",
    "    loss.backward()\n",
    "    \n",
    "    # Updating parameters\n",
    "    optimizer.step()\n",
    "    \n",
    "    # store loss\n",
    "    loss_list.append(loss.data)\n",
    "    \n",
    "    # print loss\n",
    "    if(iteration %150== 0):\n",
    "        print('epoch {}, loss {}'.format(iteration, loss.data))\n",
    "\n",
    "plt.plot(range(iteration_number),loss_list)\n",
    "plt.xlabel(\"Number of Iterations\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzt3XmcHFW5//HPNyEQEsIeFQgzEwEFEgYShk3CEgRkRyIR4oDsURThXuWi3Igg/nLdUVDUG0GJOILAVUAFQRBElkiCkJCExUAWAgghrCFsIc/vj1PTdCY9MzWZ6e5Zvu/Xq1/TVX2q+unupE7VOXWeo4jAzMwMoF+1AzAzs+7DlYKZmRW4UjAzswJXCmZmVuBKwczMClwpmJlZgSsF63Ek7SXpsWrHUU2S7pR0ava8UdKtFXjPOkkhaa0u2t/Nkk7oin1Z13Gl0MtJWiBp/xbrTpR0d7ViaimL511JyyS9KukhSYe1Vj4i/h4RH+7C9x8o6WVJ+5V47QeSrsuej5F0r6RXJL0o6R5Ju7SyzwskvZN9ppez7fboqpiLRURTRBzYXrkspl+XI4Zs/wskvZF95uck/VLSeq2Vj4iDI2JqueKxNeNKwbqL+yJiPWBD4HLgGkkbtyzUVWepxSLiTeC3wKdbvFd/YAIwVdL6wB+BHwEbA1sAXwfeamPXv80+01DgbuB3ktSyUDk+UxUdnn3m0cAuwFdbFlDiY0835R/GkLRd1hzxsqQ5ko4oeq3QTJEtF64ysv/cP5D0fHb2PEvSyOy1dSR9T9Ki7KzxZ5LWbS+WiFgJ/AJYF/igpH0lLZb0ZUn/Bn7ZvK4opi0l/U7SEklLJf246LWTJT0i6SVJt0iqbeWtpwKfkDSoaN3HSP9HbgY+lMV3VUS8GxFvRMStETErx2d6J9v/B4BNsu/wnuy7exG4oL1YJR0g6dHse/4xoKLXVrnykzRC0l+yq5nnJP23pIOA/waOyc7kZ2ZlN5B0uaRnJT0t6f9llSGS+me/4QuSngQObe+zFn3mp7Pvrfnfw52SJku6B1hO+m1b/ts6Lfv8r0maK2l0tn5zSf+X/b7zJZ2ZNw7rOFcKfZykAcAfgFuB9wFfAJok5WmeORDYm3TA3BA4BliavfbtbP1OwNakM+uv5YhnLeBUYBnwr2z1B0hn57XAxBbl+5PO4BcCddn7XJ299nHSgXAc6Wz978BVpd43Iu4Fns3KNjse+E1ErAAeB96VNFXSwZI2au+zFMW4DnAisDgiXshW7wY8SfrOJ7cVq6RNgf8jnXVvCjwB7NnKew0BbgP+DGxO+u5vj4g/A/9DdvUSETtmm0wFVmTlRpF+0+YD9WnAYdn6BuDoDnzmLYFDgAeLVh9P+v2GkH6v4vLjSZXjp4H1gSOApdkVxR+AmaTf9qPAf0j6WN5YrIMiwo9e/AAWkA6wLxc9lgN3Z6/vBfwb6Fe0zVXABdnzO4FTi147sWjb/UgHy91bbC/gdWCronV7APNbifFE0oHpZeAFYBqwf/bavsDbwMCi8vuSDrDN+10CrFVivzcDpxQt98s+e20rcXwVuDV7vn5WdlTR69sBVwCLs3hvBN7fyr4uyOJ+GXge+Cuwc9HnXZQ3VtKBclqL73dx8+/S4jeZADzYRky/Llp+P6n5a92idROAO7LnfwU+W/TagUCU+q5L/FtbCPyked/Zv6MLW5Qv/NsCbgHOKrHP3Up8V+cCv6z2/63e+uhNbZnWuo9HxG3NC5JO5L2zwc2BpyI12zRbSDora1NE/DVryrgUqJH0e+BsYCAwCHigqAldQP82djctIsa08tqSSO3+pWwJLIx0Nt9SLXCxpO8XrRPpsy0sUf5XwPmStiA1Hc2LiMKZbkQ8QjoAI2lb4NfAD0kH0lKuiYjjWnntqQ7Eunlx+YgISS23b7Yl6Uoij1pgAPBs0e/Ur+i9VnlfSn9nLa3yb62F1mKG1uOuBTaX9HLRuv6kKykrAzcf2TPAli06/mqAp7Pnr5MO8M0+ULxxRFwSETsDI0jNRf9FOtt/AxgRERtmjw0idUCuibZS+T5FqpBKneA8BXymKIYNI2LdSE1Fq79JxCLSwaaR1NTxq1YDiniUdNUwMudnWG0XHYj1WdJBE0h9OcXLJfazVQfe8y1g06L3XD8iRmSvr/K+pH8XndHe71gq7qdIV5jF38uQiDikk7FYK1wp2D9IB/5zJA2QtC9wOFm7PPAQME7SIElbA6c0byhpF0m7Zf0SrwNvAu9mVx0/B34g6X1Z2S3K1A58P+ng9S1Jg5VuL21ub/8ZcK6kEVkMG2Rt122ZCpxBarNval4paVtJX5I0LFveknSFMK2LPkdbsf4JGCFpXFb5nUmLyrnIH4EPSPoPpc7+IZJ2y157DqhrPgGIiGdJfUnfl7S+pH6StpK0T1b+GuBMScOyPpSvdNFnLeUy4GxJOyvZOutovx94VelGg3Wzzu+RauVWYOs8Vwp9XES8TerUO5h0hv8T4NPZmTDAD0ht48+RDphNRZuvTzr4v0RqWlgKfC977cvAPGCapFdJnZ9dNragKP53SZXY1sAiUlv7Mdlrvyd1eF+dxTA7+5xtuQ7YiNQ5+2zR+tdI7dv/kPQ6qTKYDXypiz5Hq7FG6pweD3yL9B1vA9zTyn5eAw4gfSf/JnXWj81evjb7u1TSP7PnnwbWBuaSfsfrgM2y135OauufCfwT+F0XfNSSIuJaYDLwG9J3fT2wcdHvuxMwn/Rv9DJgg3LF0tcpwpPsmJlZ4isFMzMrcKVgZmYFrhTMzKzAlYKZmRX0uMFrm266adTV1VU7DDOzHuWBBx54ISKGtleux1UKdXV1zJgxo9phmJn1KJLyjEh385GZmb3HlYKZmRW4UjAzs4Ie16dgZpX1zjvvsHjxYt58s7VEtdadDBw4kGHDhjFgwIA12t6Vgpm1afHixQwZMoS6ujq0+myi1o1EBEuXLmXx4sUMHz58jfbh5iMza9Obb77JJpts4gqhB5DEJpts0qmrOlcKZtYuVwg9R2d/K1cKZmZWULZKQdIvJD0vaXYrr0vSJZLmSZolaXS5YllNUxPU1UG/fulvU1N7W5hZD3DIIYfw8ssvt1nma1/7Grfd1tqMoW278847Oeyww9ott++++7Y7yPaHP/why5cvX6M4yqmcVwpXAAe18frBpMlCtgEmAj8tYyzvaWqCiRNh4UKISH8nTnTFYNaDRQQrV67kpptuYsMNN2yz7IUXXsj+++9focha1+cqhYi4C3ixjSJHAr+KZBqwoaTN2ijfNSZNgpY/xPLlab2ZdV4ZrsQvuugiRo4cyciRI/nhD38IwIIFC9huu+343Oc+x+jRo3nqqaeoq6vjhRdeAOAb3/gG2267LQcccAATJkzge99LkwKeeOKJXHfddUBKm3P++eczevRodthhBx59NE04eP/99/ORj3yEUaNG8ZGPfITHHnuszfjeeOMNjj32WOrr6znmmGN44403Cq+dfvrpNDQ0MGLECM4//3wALrnkEp555hnGjh3L2LFjWy1XFRFRtgdQB8xu5bU/AmOKlm8HGlopOxGYAcyoqamJTpEi0jXCqg+pc/s166Xmzp2bv/Cvfx0xaNCq/7cGDUrr19CMGTNi5MiRsWzZsnjttddi++23j3/+858xf/78kBT33XdfoWxtbW0sWbIkpk+fHjvuuGMsX748Xn311dh6663ju9/9bkREnHDCCXHttdcWyl9yySUREXHppZfGKaecEhERr7zySrzzzjsREfGXv/wlxo0bFxERd9xxRxx66KGrxfj9738/TjrppIiImDlzZvTv3z+mT58eERFLly6NiIgVK1bEPvvsEzNnzlwl1matlVsTpX4zYEbkOG5Xs6O5VBd5yblBI2JKRDRERMPQoe0m+WtbTU3H1ptZfmW4Er/77rs56qijGDx4MOuttx7jxo3j73//OwC1tbXsvvvuJbc58sgjWXfddRkyZAiHH354q/sfN24cADvvvDMLFiwA4JVXXmH8+PGMHDmS//zP/2TOnDltxnjXXXdx3HHHAVBfX099fX3htWuuuYbRo0czatQo5syZw9y5c0vuI2+5cqtmpbAY2LJoeRjwTNnfdfJkGDRo1XWDBqX1ZtY5ixZ1bH0O0cY88oMHD+7wNi2ts846APTv358VK1YAcN555zF27Fhmz57NH/7wh1z3/Ze6FXT+/Pl873vf4/bbb2fWrFkceuihJfeVt1wlVLNSuBH4dHYX0u7AKxHxbNnftbERpkyB2lqQ0t8pU9J6M+ucMlyJ77333lx//fUsX76c119/nd///vfstddebW4zZsyYwsF82bJl/OlPf+rQe77yyitsscUWAFxxxRW5YmzK+k5mz57NrFmzAHj11VcZPHgwG2ywAc899xw333xzYZshQ4bw2muvtVuu0sqW5kLSVcC+wKaSFgPnAwMAIuJnwE3AIcA8YDlwUrliWU1joysBs3KYPDndzVfchNTJK/HRo0dz4oknsuuuuwJw6qmnMmrUqEJTTym77LILRxxxBDvuuCO1tbU0NDSwwQYb5H7Pc845hxNOOIGLLrqI/fbbr93yp59+OieddBL19fXstNNOhVh33HFHRo0axYgRI/jgBz/InnvuWdhm4sSJHHzwwWy22WbccccdrZarNHXkMqs7aGhoCE+yY1Y5jzzyCNttt13+DZqaUh/CokXpCmHy5KqchC1btoz11luP5cuXs/feezNlyhRGj67ccKhqKvWbSXogIhra29YJ8cysa3WTK/GJEycyd+5c3nzzTU444YQ+UyF0lisFM+uVfvOb31Q7hB7JuY/MzKyg3UpB0vslXS7p5mx5e0mnlD80MzOrtDxXClcAtwCbZ8uPA/9RroDMzKx68lQKm0bENcBKgIhYAbxb1qjMzKwq8lQKr0vahCwFRfNAs7JGZWZWRuuttx4AzzzzDEcffXSbZdckm2lPTrGdp1L4Imn08VaS7gF+BXyhrFGZmXXQu+92vAFj8803L2RMbU21U1x3u0ohIv4J7AN8BPgMMCIiZpU7MDPrmbo6c/aCBQvYdtttOeGEE6ivr+foo48uHCTr6uq48MILGTNmDNdeey1PPPEEBx10EDvvvDN77bVXIRX2/Pnz2WOPPdhll10477zzVtn3yJEjgVSpnH322eywww7U19fzox/9qGSK61tvvZU99tiD0aNHM378eJYtWwbAn//8Z7bddlvGjBnD7373u5KfpUek2G4vjSrweWDDouWNgM/lScFajsfOO++8RqlkzWzNdCR1dhkyZ8f8+fMDiLvvvjsiIk466aRCGuza2tr49re/XSi73377xeOPPx4REdOmTYuxY8dGRMThhx8eU6dOjYiIH//4xzF48ODCvkeMGBERET/5yU9i3LhxhZTZzamsi1NcL1myJPbaa69YtmxZRER861vfiq9//evxxhtvxLBhw+Lxxx+PlStXxvjx46uaYrvcqbNPi4jC/HYR8RJwWtdXT2bW05VrDqstt9yykA/ouOOO4+677y68dswxxwAprcW9997L+PHj2WmnnfjMZz7Ds8+mHJv33HMPEyZMAOD4448v+R633XYbn/3sZ1lrrTSmd+ONN16tzLRp05g7dy577rknO+20E1OnTmXhwoU8+uijDB8+nG222QZJhTTaLfWEFNt5RjT3k9IMNACS+gNrd2kUZtYrlCFzNrB6Wuri5eb02StXrmTDDTfkoYceyrWPliIiV5kDDjiAq666apX1Dz30ULvbthVHc+rs6dOns9FGG3HiiSe2mWK7vXKdkedK4RbgGkkflbQfcBXw5y6Nwsx6hXLNYbVo0SLuu+8+AK666irGjBmzWpn111+f4cOHc+211wLpAD5z5kwA9txzT66++mqAQorrlg488EB+9rOfFeZUePHFNJtwcYrr3XffnXvuuYd58+YBsHz5ch5//HG23XZb5s+fzxNPPFGIsZSekGI7T6XwZeCvwOmk/oXb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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# predict our car price \n",
    "predicted = model(house_price_k).data.numpy()\n",
    "plt.scatter(house_price_k,houses_sold,label = \"original data\",color =\"red\")\n",
    "plt.scatter(house_price_k,predicted,label = \"predicted data\",color =\"blue\")\n",
    "plt.legend()\n",
    "plt.xlabel(\"House prices in £1000 (normalized)\")\n",
    "plt.ylabel(\"Number of houses sold at that price\")\n",
    "plt.title(\"House Price VS Predicted Price\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Linear Regression can lead to better results than Linear Regression for Classification porpuses\n",
    "\n",
    "Logistic Regression = Linear Regression + Logistic Function(softmax)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Logistic regression is good at classification but when complexity(non linearity) increases, the accuracy of model decreases."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAEICAYAAACZA4KlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAACdRJREFUeJzt3X1sleUdxvHf3VaptCANWMZ4G1NJGSrR2agsTDfX0USmKJJBTJDMaQbZlCnZ3MLAZXMuixpFRubIjLhlsHWAaOacFSVxk7cqMF4K0i3iKkWZMAqUFui598eoYeQ8v7LT09OX6/tJSChXH85j9JtHuT1tiDEagN4vr6tvAEBuEDsggtgBEcQOiCB2QASxAyKIHRBB7OJCCL8JITSEEBpDCO+EEL7ufO63Qwj7QwiHQwjPhBD65PJe0TGB/6lGWwhhrJnVxRhbQghlZrbWzG6KMb511udNNLPnzOyLZrbPzFaZ2foY44M5vmVkiCe7uBjjjhhjS9uHp39cnOZT7zSzX53+/ENm9iMzm5mbu0Q2EDsshLA4hNBkZrvMrMHMXkrzaWPNbOsZH281s8EhhIE5uEVkAbHDYoyzzayfmU0ws5Vm1pLm04rN7PAZH7f9vF/n3h2yhdhhZmYxxtYY41/MbJiZzUrzKUfNrP8ZH7f9/Ehn3xuyg9hxtgJL/9/sO8xs3BkfjzOzD2KMH+XkrtBhxC4shFAaQpgWQigOIeSf/hP36Wb2WppPf87M7gohfCaEUGJm88zs2RzeLjqI2LVF+++/steb2SEze9TM5sQYV4cQRoQQjoYQRpiZxRhfNrOfmdnrZrb39I8FXXPbyATn7IAInuyACGIHRBA7IILYAREFuXyxiryp/Gkg0MmqU1Uh3a/zZAdEEDsggtgBEcQOiCB2QASxAyKIHRBB7IAIYgdEEDsggtgBEcQOiCB2QASxAyKIHRBB7IAIYgdEEDsggtgBEcQOiCB2QASxAyKIHRBB7IAIYgdEEDsggtgBEcQOiCB2QASxAyKIHRBB7IAIYgdEEDsggtgBEcQOiCB2QASxAyKIHRBB7IAIYgdEEDsggtgBEcQOiCB2QASxAyIKuvoGYFYwfJi718719/HluxK3pSNfy+ie2hyPJ9x90s5p7r63rjRx67+nY//4Df1tnbunDv47cYsn/b+u3ognOyCC2AERxA6IIHZABLEDIogdEMHR2znKv2RU4vbelCHutWWT3nH33336hYzuqU1jqjlxW3HMv7f2FIaT7r5m7Er/NxjboZf3zfXnH//rssRt+aob3GtHPlzj7j3x6I4nOyCC2AERxA6IIHZABLEDIogdEEHsgAjO2c/R+JW1iduLA1d06Pf+cu1kd6/fMNTdR606krjFmu0Z3VObE5Xl7j5hyZP+vij5MHzI+uMZ3VObhusucPfyydsSt+13L3KvvaT0G+4+evZGd++OeLIDIogdEEHsgAhiB0QQOyCC2AERxA6ICDHGnL1YRd7U3L1Yln34zfGJW/NA/9pPrU7+ksZmZqktOzO5pZxonH6tux8f5D8vBj/1ZjZv5/+SX1KSuN2zcZN77Z6Wwe6+5rOD3D22tLh7Z6pOVYV0v86THRBB7IAIYgdEEDsggtgBEcQOiCB2QATvZz9HpYsyPy9OZfE+cq3/svX+3omv3fqFq9z979Py3f3PlU8kbhcX+O+Fv/7BO9y9qGWDu3dHPNkBEcQOiCB2QASxAyKIHRBB7IAIYgdEcM6ODsnr29fd6+aPS9weuvX37rXTit9294bWJnf/YcPExO39Sf59Fx3oeefo7eHJDoggdkAEsQMiiB0QQeyACGIHRHD0lgV5RUXuvndO8vGTmVk8L5t3878u2O9/9e7jn0j7VYc/1jz0pLsvmLDa3W8pejVxu333NPfaxU8PcfcB6+rd/VT9+856zL22N+LJDoggdkAEsQMiiB0QQeyACGIHRBA7IIJz9iw4OOUKd58/Y5m7Ty3+KJu3k1V/bCp29+89M9Pdl1c3Jm4FNdvda4vtPXc/5a44G092QASxAyKIHRBB7IAIYgdEEDsggtgBESFG//3O2VSRNzV3L9aN5Pdv5xsbD/fft92Zdt1T4u7fqXjR3TcfHeHu/3igLHHLe2Ozey0yU52qSvtFCniyAyKIHRBB7IAIYgdEEDsggtgBEcQOiOCcHa68wkJ3f/e7V7n703cuTtzm7bnVvbbvzfvcPba0uLsqztkBccQOiCB2QASxAyKIHRBB7IAIYgdEcM5+WmrCle5+fl1D4naqYX+2b6fXCOWXJ273L1vuXvvXY6PdfeMM/+v1p7bWuntvxTk7II7YARHEDoggdkAEsQMiiB0QIXP0VjByuLsvWLvS3X8w/a7kcf3fMrkleScqy939lseq3f3SPv6R51NfnZK4xbd2uNf2ZBy9AeKIHRBB7IAIYgdEEDsggtgBEcQOiCjo6hvIlfrb/HP2GZu+5u4jOUvPuvNf3uTur+z1z+ELV7zp7gMWJr8t+XBlP/fa1JEj7t4T8WQHRBA7IILYARHEDoggdkAEsQMiiB0QIXPO3p6Wxj5dfQs4S2vtHndf8uTN7r5x/s8Tt89XznKvLa7a4O49EU92QASxAyKIHRBB7IAIYgdEEDsggtgBETLn7EUNKXevnFHj7tsuuihxaz1wIKN7QseULt3s7r+4b2Ti9sHkE+61xVUZ3VK3xpMdEEHsgAhiB0QQOyCC2AERxA6IkDl6G/DSTne/6Sdb3P3V25LfEjloyUH/xVOt/o6MpJqb3X3D4VGJ28zL17nXvmGFGd1Td8aTHRBB7IAIYgdEEDsggtgBEcQOiCB2QITMOXtrY6O73/vEbHd/fd6jidvVY+53rx39ff/bPaeamtwd6b378HXu/viQxxO32599wL12hPnfDron4skOiCB2QASxAyKIHRBB7IAIYgdEEDsgQuacvT2DF/rnqjeEuYlbzdzkM3gzs1/eOM7dn3/kRncv+dNud289dMjdu61rr3DnPbP8fzxrv7TQ3cteuC95e2ybe63/hcd7Jp7sgAhiB0QQOyCC2AERxA6IIHZABLEDIkKMMWcvVpE3NXcvlkOp66909333+t8e+Ftj1rp7WZ8Gd5/19h2J24XPF7nXntfk/y1pHJHv7k3X+O/F/+nVKxO3iX0/dK9d2nipuy/+9Vfcfdgjve896eeiOlUV0v06T3ZABLEDIogdEEHsgAhiB0QQOyCC2AERnLN3A/kDLnT33Q+NcfdrypPf7z7nk6+41+47VeLuk4uOuvvd//ycu6+puSxxK12X9jj4YyV/2OLu7X1/dlWcswPiiB0QQeyACGIHRBA7IILYAREcvQG9DEdvgDhiB0QQOyCC2AERxA6IIHZABLEDIogdEEHsgAhiB0QQOyCC2AERxA6IIHZABLEDInL6fnYAXYcnOyCC2AERxA6IIHZABLEDIogdEEHsgAhiB0QQOyCC2AERxA6IIHZABLEDIogdEEHsgAhiB0QQOyCC2AERxA6IIHZABLEDIogdEEHsgIj/ACeQ2HGKixaXAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Prepare Dataset\n",
    "# load data\n",
    "train = pd.read_csv(r\"../input/train.csv\",dtype = np.float32)\n",
    "\n",
    "# split data into features(pixels) and labels(numbers from 0 to 9)\n",
    "targets_numpy = train.label.values\n",
    "features_numpy = train.loc[:,train.columns != \"label\"].values/255 # normalization\n",
    "\n",
    "# train test split. Size of train data is 80% and size of test data is 20%. \n",
    "features_train, features_test, targets_train, targets_test = train_test_split(features_numpy,\n",
    "                                                                             targets_numpy,\n",
    "                                                                             test_size = 0.2,\n",
    "                                                                             random_state = 42) \n",
    "\n",
    "# create feature and targets tensor for train set. As you remember we need variable to accumulate gradients. Therefore first we create tensor, then we will create variable\n",
    "featuresTrain = torch.from_numpy(features_train)\n",
    "targetsTrain = torch.from_numpy(targets_train).type(torch.LongTensor) # data type is long\n",
    "\n",
    "# create feature and targets tensor for test set.\n",
    "featuresTest = torch.from_numpy(features_test)\n",
    "targetsTest = torch.from_numpy(targets_test).type(torch.LongTensor) # data type is long\n",
    "\n",
    "# batch_size, epoch and iteration\n",
    "batch_size = 100\n",
    "n_iters = 50000\n",
    "num_epochs = n_iters / (len(features_train) / batch_size)\n",
    "num_epochs = int(num_epochs)\n",
    "\n",
    "# Pytorch train and test sets\n",
    "train = torch.utils.data.TensorDataset(featuresTrain,targetsTrain)\n",
    "test = torch.utils.data.TensorDataset(featuresTest,targetsTest)\n",
    "\n",
    "# data loader\n",
    "train_loader = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = False)\n",
    "test_loader = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = False)\n",
    "\n",
    "# visualize one of the images in data set\n",
    "plt.imshow(features_numpy[7].reshape(28,28))\n",
    "plt.axis(\"off\")\n",
    "plt.title(str(targets_numpy[7]))\n",
    "plt.savefig('graph.png')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create Logistic Regression Model\n",
    "class LogisticRegressionModel(nn.Module):\n",
    "    def __init__(self, input_dim, output_dim):\n",
    "        super(LogisticRegressionModel, self).__init__()\n",
    "        # Linear part\n",
    "        self.linear = nn.Linear(input_dim, output_dim)\n",
    "        # There should be logistic function right?\n",
    "        # However logistic function in pytorch is in loss function\n",
    "        # So actually we do not forget to put it, it is only at next parts\n",
    "    \n",
    "    def forward(self, x):\n",
    "        out = self.linear(x)\n",
    "        return out\n",
    "\n",
    "# Instantiate Model Class\n",
    "input_dim = 28*28 # size of image px*px\n",
    "output_dim = 10  # labels 0,1,2,3,4,5,6,7,8,9\n",
    "\n",
    "# create logistic regression model\n",
    "model = LogisticRegressionModel(input_dim, output_dim)\n",
    "\n",
    "# Cross Entropy Loss  \n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "# SGD Optimizer \n",
    "learning_rate = 0.001\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration: 700  Loss: 1.7678580284118652  Accuracy: 71%\n",
      "Iteration: 1400  Loss: 1.4187887907028198  Accuracy: 77%\n",
      "Iteration: 2100  Loss: 1.135074257850647  Accuracy: 79%\n",
      "Iteration: 2800  Loss: 1.0227187871932983  Accuracy: 81%\n",
      "Iteration: 3500  Loss: 0.9017693996429443  Accuracy: 82%\n",
      "Iteration: 4200  Loss: 0.8971323370933533  Accuracy: 82%\n",
      "Iteration: 4900  Loss: 0.7907500267028809  Accuracy: 83%\n",
      "Iteration: 5600  Loss: 0.8370683789253235  Accuracy: 84%\n",
      "Iteration: 6300  Loss: 0.6618599891662598  Accuracy: 84%\n",
      "Iteration: 7000  Loss: 0.7134055495262146  Accuracy: 84%\n",
      "Iteration: 7700  Loss: 0.6634719967842102  Accuracy: 85%\n",
      "Iteration: 8400  Loss: 0.5648887753486633  Accuracy: 85%\n",
      "Iteration: 9100  Loss: 0.6367565393447876  Accuracy: 85%\n",
      "Iteration: 9800  Loss: 0.6771481037139893  Accuracy: 85%\n",
      "Iteration: 10500  Loss: 0.5320725440979004  Accuracy: 85%\n",
      "Iteration: 11200  Loss: 0.6205548644065857  Accuracy: 85%\n",
      "Iteration: 11900  Loss: 0.5510497093200684  Accuracy: 86%\n",
      "Iteration: 12600  Loss: 0.6348696351051331  Accuracy: 86%\n",
      "Iteration: 13300  Loss: 0.5521681308746338  Accuracy: 86%\n",
      "Iteration: 14000  Loss: 0.6443211436271667  Accuracy: 86%\n",
      "Iteration: 14700  Loss: 0.4829789102077484  Accuracy: 86%\n",
      "Iteration: 15400  Loss: 0.534584641456604  Accuracy: 86%\n",
      "Iteration: 16100  Loss: 0.5325627326965332  Accuracy: 87%\n",
      "Iteration: 16800  Loss: 0.41932564973831177  Accuracy: 87%\n",
      "Iteration: 17500  Loss: 0.5055068731307983  Accuracy: 87%\n",
      "Iteration: 18200  Loss: 0.5722574591636658  Accuracy: 87%\n",
      "Iteration: 18900  Loss: 0.419083833694458  Accuracy: 87%\n",
      "Iteration: 19600  Loss: 0.5383422374725342  Accuracy: 87%\n",
      "Iteration: 20300  Loss: 0.4645698666572571  Accuracy: 87%\n",
      "Iteration: 21000  Loss: 0.5645937323570251  Accuracy: 87%\n",
      "Iteration: 21700  Loss: 0.48789075016975403  Accuracy: 87%\n",
      "Iteration: 22400  Loss: 0.59394371509552  Accuracy: 87%\n",
      "Iteration: 23100  Loss: 0.42540183663368225  Accuracy: 87%\n",
      "Iteration: 23800  Loss: 0.4704318642616272  Accuracy: 87%\n",
      "Iteration: 24500  Loss: 0.4859793782234192  Accuracy: 87%\n",
      "Iteration: 25200  Loss: 0.35781046748161316  Accuracy: 87%\n",
      "Iteration: 25900  Loss: 0.4476511776447296  Accuracy: 87%\n",
      "Iteration: 26600  Loss: 0.5236813426017761  Accuracy: 87%\n",
      "Iteration: 27300  Loss: 0.3662956655025482  Accuracy: 88%\n",
      "Iteration: 28000  Loss: 0.4979512393474579  Accuracy: 88%\n",
      "Iteration: 28700  Loss: 0.4212998151779175  Accuracy: 88%\n",
      "Iteration: 29400  Loss: 0.5288758873939514  Accuracy: 88%\n",
      "Iteration: 30100  Loss: 0.4578320384025574  Accuracy: 88%\n",
      "Iteration: 30800  Loss: 0.5719488263130188  Accuracy: 88%\n",
      "Iteration: 31500  Loss: 0.3955562710762024  Accuracy: 88%\n",
      "Iteration: 32200  Loss: 0.435679167509079  Accuracy: 88%\n",
      "Iteration: 32900  Loss: 0.4606853127479553  Accuracy: 88%\n",
      "Iteration: 33600  Loss: 0.3216397166252136  Accuracy: 88%\n",
      "Iteration: 34300  Loss: 0.4124681353569031  Accuracy: 88%\n",
      "Iteration: 35000  Loss: 0.4931466281414032  Accuracy: 88%\n",
      "Iteration: 35700  Loss: 0.33463847637176514  Accuracy: 88%\n",
      "Iteration: 36400  Loss: 0.47244957089424133  Accuracy: 88%\n",
      "Iteration: 37100  Loss: 0.39423155784606934  Accuracy: 88%\n",
      "Iteration: 37800  Loss: 0.5058847665786743  Accuracy: 88%\n",
      "Iteration: 38500  Loss: 0.440612256526947  Accuracy: 88%\n",
      "Iteration: 39200  Loss: 0.5599409937858582  Accuracy: 88%\n",
      "Iteration: 39900  Loss: 0.37667495012283325  Accuracy: 88%\n",
      "Iteration: 40600  Loss: 0.41333991289138794  Accuracy: 88%\n",
      "Iteration: 41300  Loss: 0.4440905749797821  Accuracy: 88%\n",
      "Iteration: 42000  Loss: 0.2971433997154236  Accuracy: 88%\n",
      "Iteration: 42700  Loss: 0.38776564598083496  Accuracy: 88%\n",
      "Iteration: 43400  Loss: 0.4711166322231293  Accuracy: 88%\n",
      "Iteration: 44100  Loss: 0.31320443749427795  Accuracy: 88%\n",
      "Iteration: 44800  Loss: 0.45433321595191956  Accuracy: 88%\n",
      "Iteration: 45500  Loss: 0.3753468692302704  Accuracy: 88%\n",
      "Iteration: 46200  Loss: 0.48912787437438965  Accuracy: 88%\n",
      "Iteration: 46900  Loss: 0.4296184480190277  Accuracy: 88%\n",
      "Iteration: 47600  Loss: 0.5524317026138306  Accuracy: 89%\n",
      "Iteration: 48300  Loss: 0.3632795214653015  Accuracy: 89%\n",
      "Iteration: 49000  Loss: 0.3975844979286194  Accuracy: 89%\n",
      "Iteration: 49700  Loss: 0.4320122003555298  Accuracy: 89%\n"
     ]
    }
   ],
   "source": [
    "# Traning the Model\n",
    "count = 0\n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "for epoch in range(num_epochs):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        \n",
    "        # Define variables\n",
    "        train = Variable(images.view(-1, 28*28))\n",
    "        labels = Variable(labels)\n",
    "        \n",
    "        # Clear gradients\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # Forward propagation\n",
    "        outputs = model(train)\n",
    "        \n",
    "        # Calculate softmax and cross entropy loss\n",
    "        loss = error(outputs, labels)\n",
    "        \n",
    "        # Calculate gradients\n",
    "        loss.backward()\n",
    "        \n",
    "        # Update parameters\n",
    "        optimizer.step()\n",
    "        \n",
    "        count += 1\n",
    "        \n",
    "        # Prediction\n",
    "        if count % 50 == 0:\n",
    "            # Calculate Accuracy         \n",
    "            correct = 0\n",
    "            total = 0\n",
    "            # Predict test dataset\n",
    "            for images, labels in test_loader: \n",
    "                test = Variable(images.view(-1, 28*28))\n",
    "                \n",
    "                # Forward propagation\n",
    "                outputs = model(test)\n",
    "                \n",
    "                # Get predictions from the maximum value\n",
    "                predicted = torch.max(outputs.data, 1)[1]\n",
    "                \n",
    "                # Total number of labels\n",
    "                total += len(labels)\n",
    "                \n",
    "                # Total correct predictions\n",
    "                correct += (predicted == labels).sum()\n",
    "            \n",
    "            accuracy = 100 * correct / float(total)\n",
    "            \n",
    "            # store loss and iteration\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "        if count % 700 == 0:\n",
    "            # Print Loss\n",
    "            print('Iteration: {}  Loss: {}  Accuracy: {}%'.format(count, loss.data, accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualization\n",
    "plt.plot(iteration_list,loss_list)\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"Logistic Regression: Loss vs Number of iteration\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Artificial Neural Network (ANN)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ANNs are able to better fit data containing non-linearities (by adding more non linear functions as hidden layer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create ANN Model\n",
    "class ANNModel(nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, output_dim):\n",
    "        super(ANNModel, self).__init__()\n",
    "        # Linear function 1: 784 --> 100\n",
    "        self.fc1 = nn.Linear(input_dim, hidden_dim) \n",
    "        # Non-linearity 1\n",
    "        self.relu1 = nn.ReLU()\n",
    "        \n",
    "        # Linear function 2: 100 --> 100\n",
    "        self.fc2 = nn.Linear(hidden_dim, hidden_dim)\n",
    "        # Non-linearity 2\n",
    "        self.tanh2 = nn.Tanh()\n",
    "        \n",
    "        # Linear function 3: 100 --> 100\n",
    "        self.fc3 = nn.Linear(hidden_dim, hidden_dim)\n",
    "        # Non-linearity 3\n",
    "        self.elu3 = nn.ELU()\n",
    "        \n",
    "        # Linear function 4 (readout): 100 --> 10\n",
    "        self.fc4 = nn.Linear(hidden_dim, output_dim)  \n",
    "    \n",
    "    def forward(self, x):\n",
    "        # Linear function 1\n",
    "        out = self.fc1(x)\n",
    "        # Non-linearity 1\n",
    "        out = self.relu1(out)\n",
    "        \n",
    "        # Linear function 2\n",
    "        out = self.fc2(out)\n",
    "        # Non-linearity 2\n",
    "        out = self.tanh2(out)\n",
    "        \n",
    "        # Linear function 2\n",
    "        out = self.fc3(out)\n",
    "        # Non-linearity 2\n",
    "        out = self.elu3(out)\n",
    "        \n",
    "        # Linear function 4 (readout)\n",
    "        out = self.fc4(out)\n",
    "        return out\n",
    "\n",
    "# instantiate ANN\n",
    "input_dim = 28*28\n",
    "hidden_dim = 100 #hidden layer dim is one of the hyper parameter and it should be chosen and tuned. For now I only say 150 there is no reason.\n",
    "output_dim = 10\n",
    "\n",
    "# Create ANN\n",
    "model = ANNModel(input_dim, hidden_dim, output_dim)\n",
    "\n",
    "# Cross Entropy Loss \n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "# SGD Optimizer\n",
    "learning_rate = 0.04\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration: 500  Loss: 0.44547438621520996  Accuracy: 86 %\n",
      "Iteration: 1000  Loss: 0.302815705537796  Accuracy: 90 %\n",
      "Iteration: 1500  Loss: 0.1231832280755043  Accuracy: 92 %\n",
      "Iteration: 2000  Loss: 0.19104915857315063  Accuracy: 93 %\n",
      "Iteration: 2500  Loss: 0.1761694699525833  Accuracy: 94 %\n",
      "Iteration: 3000  Loss: 0.07308691740036011  Accuracy: 95 %\n",
      "Iteration: 3500  Loss: 0.19082306325435638  Accuracy: 95 %\n",
      "Iteration: 4000  Loss: 0.027083057910203934  Accuracy: 95 %\n",
      "Iteration: 4500  Loss: 0.14932426810264587  Accuracy: 95 %\n",
      "Iteration: 5000  Loss: 0.05842341482639313  Accuracy: 96 %\n",
      "Iteration: 5500  Loss: 0.1404922604560852  Accuracy: 95 %\n",
      "Iteration: 6000  Loss: 0.10998567938804626  Accuracy: 96 %\n",
      "Iteration: 6500  Loss: 0.07648640125989914  Accuracy: 96 %\n",
      "Iteration: 7000  Loss: 0.0356624498963356  Accuracy: 96 %\n",
      "Iteration: 7500  Loss: 0.04366530850529671  Accuracy: 96 %\n",
      "Iteration: 8000  Loss: 0.14773298799991608  Accuracy: 96 %\n",
      "Iteration: 8500  Loss: 0.010381107218563557  Accuracy: 96 %\n",
      "Iteration: 9000  Loss: 0.029963618144392967  Accuracy: 96 %\n",
      "Iteration: 9500  Loss: 0.008971581235527992  Accuracy: 96 %\n",
      "Iteration: 10000  Loss: 0.07553261518478394  Accuracy: 96 %\n",
      "Iteration: 10500  Loss: 0.008767986670136452  Accuracy: 96 %\n",
      "Iteration: 11000  Loss: 0.02137397788465023  Accuracy: 96 %\n",
      "Iteration: 11500  Loss: 0.009540701285004616  Accuracy: 96 %\n",
      "Iteration: 12000  Loss: 0.012389316223561764  Accuracy: 96 %\n",
      "Iteration: 12500  Loss: 0.01836680807173252  Accuracy: 96 %\n",
      "Iteration: 13000  Loss: 0.010748462751507759  Accuracy: 96 %\n",
      "Iteration: 13500  Loss: 0.011983213014900684  Accuracy: 96 %\n",
      "Iteration: 14000  Loss: 0.015543813817203045  Accuracy: 96 %\n",
      "Iteration: 14500  Loss: 0.008032522164285183  Accuracy: 96 %\n",
      "Iteration: 15000  Loss: 0.004994420800358057  Accuracy: 96 %\n",
      "Iteration: 15500  Loss: 0.006253919564187527  Accuracy: 96 %\n",
      "Iteration: 16000  Loss: 0.004228792153298855  Accuracy: 96 %\n",
      "Iteration: 16500  Loss: 0.0028422498144209385  Accuracy: 96 %\n",
      "Iteration: 17000  Loss: 0.009465274401009083  Accuracy: 96 %\n",
      "Iteration: 17500  Loss: 0.0031199550721794367  Accuracy: 96 %\n",
      "Iteration: 18000  Loss: 0.003399495966732502  Accuracy: 96 %\n",
      "Iteration: 18500  Loss: 0.003396101063117385  Accuracy: 96 %\n",
      "Iteration: 19000  Loss: 0.0027019167318940163  Accuracy: 96 %\n",
      "Iteration: 19500  Loss: 0.002737827366217971  Accuracy: 96 %\n",
      "Iteration: 20000  Loss: 0.0036526776384562254  Accuracy: 97 %\n",
      "Iteration: 20500  Loss: 0.0038209438789635897  Accuracy: 96 %\n",
      "Iteration: 21000  Loss: 0.002463636454194784  Accuracy: 97 %\n",
      "Iteration: 21500  Loss: 0.0023050212766975164  Accuracy: 96 %\n",
      "Iteration: 22000  Loss: 0.002588987350463867  Accuracy: 97 %\n",
      "Iteration: 22500  Loss: 0.0007423686911351979  Accuracy: 97 %\n",
      "Iteration: 23000  Loss: 0.0012043475871905684  Accuracy: 97 %\n",
      "Iteration: 23500  Loss: 0.0008167934138327837  Accuracy: 96 %\n",
      "Iteration: 24000  Loss: 0.0011060046963393688  Accuracy: 96 %\n",
      "Iteration: 24500  Loss: 0.002520275069400668  Accuracy: 96 %\n",
      "Iteration: 25000  Loss: 0.002534847240895033  Accuracy: 96 %\n",
      "Iteration: 25500  Loss: 0.002081689890474081  Accuracy: 96 %\n",
      "Iteration: 26000  Loss: 0.0007472610450349748  Accuracy: 96 %\n",
      "Iteration: 26500  Loss: 0.0014505147701129317  Accuracy: 96 %\n",
      "Iteration: 27000  Loss: 0.0011870383750647306  Accuracy: 96 %\n",
      "Iteration: 27500  Loss: 0.0007831096882000566  Accuracy: 97 %\n",
      "Iteration: 28000  Loss: 0.0016515827737748623  Accuracy: 96 %\n",
      "Iteration: 28500  Loss: 0.0007355499546974897  Accuracy: 96 %\n",
      "Iteration: 29000  Loss: 0.0013728332705795765  Accuracy: 96 %\n",
      "Iteration: 29500  Loss: 0.0004985332489013672  Accuracy: 96 %\n",
      "Iteration: 30000  Loss: 0.0003001594450324774  Accuracy: 96 %\n",
      "Iteration: 30500  Loss: 0.0006110668182373047  Accuracy: 96 %\n",
      "Iteration: 31000  Loss: 0.001372327795252204  Accuracy: 96 %\n",
      "Iteration: 31500  Loss: 0.0005781746003776789  Accuracy: 97 %\n",
      "Iteration: 32000  Loss: 0.0014756298623979092  Accuracy: 96 %\n",
      "Iteration: 32500  Loss: 0.0005558013799600303  Accuracy: 96 %\n",
      "Iteration: 33000  Loss: 0.0015986919170245528  Accuracy: 96 %\n",
      "Iteration: 33500  Loss: 0.0007339859148487449  Accuracy: 96 %\n",
      "Iteration: 34000  Loss: 0.0010948276612907648  Accuracy: 96 %\n",
      "Iteration: 34500  Loss: 0.0010361385066062212  Accuracy: 96 %\n",
      "Iteration: 35000  Loss: 0.0017168617341667414  Accuracy: 96 %\n",
      "Iteration: 35500  Loss: 0.0007121753878891468  Accuracy: 97 %\n",
      "Iteration: 36000  Loss: 0.0013539028586819768  Accuracy: 96 %\n",
      "Iteration: 36500  Loss: 0.0005944728618487716  Accuracy: 96 %\n",
      "Iteration: 37000  Loss: 0.0010301208822056651  Accuracy: 96 %\n",
      "Iteration: 37500  Loss: 0.0012800502590835094  Accuracy: 96 %\n",
      "Iteration: 38000  Loss: 0.0008775520254857838  Accuracy: 97 %\n",
      "Iteration: 38500  Loss: 0.0008345126989297569  Accuracy: 97 %\n",
      "Iteration: 39000  Loss: 0.0008899306994862854  Accuracy: 97 %\n",
      "Iteration: 39500  Loss: 0.0005740547203458846  Accuracy: 97 %\n",
      "Iteration: 40000  Loss: 0.0005812072777189314  Accuracy: 96 %\n",
      "Iteration: 40500  Loss: 0.00017393112648278475  Accuracy: 96 %\n",
      "Iteration: 41000  Loss: 0.0010617923690006137  Accuracy: 96 %\n",
      "Iteration: 41500  Loss: 0.0007337188581004739  Accuracy: 97 %\n",
      "Iteration: 42000  Loss: 0.00023684502230025828  Accuracy: 97 %\n",
      "Iteration: 42500  Loss: 0.00045371055603027344  Accuracy: 97 %\n",
      "Iteration: 43000  Loss: 0.000601272564381361  Accuracy: 97 %\n",
      "Iteration: 43500  Loss: 0.00035351753467693925  Accuracy: 97 %\n",
      "Iteration: 44000  Loss: 0.001043081283569336  Accuracy: 97 %\n",
      "Iteration: 44500  Loss: 0.0008967971662059426  Accuracy: 96 %\n",
      "Iteration: 45000  Loss: 0.0004156208015047014  Accuracy: 97 %\n",
      "Iteration: 45500  Loss: 0.00045309067354537547  Accuracy: 97 %\n",
      "Iteration: 46000  Loss: 0.0003272533358540386  Accuracy: 97 %\n",
      "Iteration: 46500  Loss: 0.000945615756791085  Accuracy: 97 %\n",
      "Iteration: 47000  Loss: 0.0004245472082402557  Accuracy: 97 %\n",
      "Iteration: 47500  Loss: 0.0006617450853809714  Accuracy: 97 %\n",
      "Iteration: 48000  Loss: 0.0005874347407370806  Accuracy: 96 %\n",
      "Iteration: 48500  Loss: 0.00028196335188113153  Accuracy: 97 %\n",
      "Iteration: 49000  Loss: 0.0005629730294458568  Accuracy: 97 %\n",
      "Iteration: 49500  Loss: 0.0004016399325337261  Accuracy: 97 %\n"
     ]
    }
   ],
   "source": [
    "# ANN model training\n",
    "count = 0\n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "accuracy_list = []\n",
    "for epoch in range(num_epochs):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "\n",
    "        train = Variable(images.view(-1, 28*28))\n",
    "        labels = Variable(labels)\n",
    "        \n",
    "        # Clear gradients\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # Forward propagation\n",
    "        outputs = model(train)\n",
    "        \n",
    "        # Calculate softmax and ross entropy loss\n",
    "        loss = error(outputs, labels)\n",
    "        \n",
    "        # Calculating gradients\n",
    "        loss.backward()\n",
    "        \n",
    "        # Update parameters\n",
    "        optimizer.step()\n",
    "        \n",
    "        count += 1\n",
    "        \n",
    "        if count % 50 == 0:\n",
    "            # Calculate Accuracy         \n",
    "            correct = 0\n",
    "            total = 0\n",
    "            # Predict test dataset\n",
    "            for images, labels in test_loader:\n",
    "\n",
    "                test = Variable(images.view(-1, 28*28))\n",
    "                \n",
    "                # Forward propagation\n",
    "                outputs = model(test)\n",
    "                \n",
    "                # Get predictions from the maximum value\n",
    "                predicted = torch.max(outputs.data, 1)[1]\n",
    "                \n",
    "                # Total number of labels\n",
    "                total += len(labels)\n",
    "\n",
    "                # Total correct predictions\n",
    "                correct += (predicted == labels).sum()\n",
    "            \n",
    "            accuracy = 100 * correct / float(total)\n",
    "            \n",
    "            # store loss and iteration\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "            accuracy_list.append(accuracy)\n",
    "            if count % 500 == 0:\n",
    "                # Print Loss\n",
    "                print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.data.item(), accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualization loss \n",
    "plt.plot(iteration_list,loss_list)\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"ANN: Loss vs Number of iteration\")\n",
    "plt.show()\n",
    "\n",
    "# visualization accuracy \n",
    "plt.plot(iteration_list,accuracy_list,color = \"red\")\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.title(\"ANN: Accuracy vs Number of iteration\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional Neural Network (CNN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create CNN Model\n",
    "class CNNModel(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNNModel, self).__init__()\n",
    "        \n",
    "        # Convolution 1\n",
    "        self.cnn1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=0)\n",
    "        self.relu1 = nn.ReLU()\n",
    "        \n",
    "        # Max pool 1\n",
    "        self.maxpool1 = nn.MaxPool2d(kernel_size=2)\n",
    "     \n",
    "        # Convolution 2\n",
    "        self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=0)\n",
    "        self.relu2 = nn.ReLU()\n",
    "        \n",
    "        # Max pool 2\n",
    "        self.maxpool2 = nn.MaxPool2d(kernel_size=2)\n",
    "        \n",
    "        # Fully connected 1\n",
    "        self.fc1 = nn.Linear(32 * 4 * 4, 10) \n",
    "    \n",
    "    def forward(self, x):\n",
    "        # Convolution 1\n",
    "        out = self.cnn1(x)\n",
    "        out = self.relu1(out)\n",
    "        \n",
    "        # Max pool 1\n",
    "        out = self.maxpool1(out)\n",
    "        \n",
    "        # Convolution 2 \n",
    "        out = self.cnn2(out)\n",
    "        out = self.relu2(out)\n",
    "        \n",
    "        # Max pool 2 \n",
    "        out = self.maxpool2(out)\n",
    "        out = out.view(out.size(0), -1)\n",
    "\n",
    "        # Linear function (readout)\n",
    "        out = self.fc1(out)\n",
    "        \n",
    "        return out\n",
    "\n",
    "# batch_size, epoch and iteration\n",
    "batch_size = 100\n",
    "n_iters = 2500\n",
    "num_epochs = n_iters / (len(features_train) / batch_size)\n",
    "num_epochs = int(num_epochs)\n",
    "\n",
    "# Pytorch train and test sets\n",
    "train = torch.utils.data.TensorDataset(featuresTrain,targetsTrain)\n",
    "test = torch.utils.data.TensorDataset(featuresTest,targetsTest)\n",
    "\n",
    "# data loader\n",
    "train_loader = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = False)\n",
    "test_loader = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = False)\n",
    "    \n",
    "# Create ANN\n",
    "model = CNNModel()\n",
    "\n",
    "# Cross Entropy Loss \n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "# SGD Optimizer\n",
    "learning_rate = 0.1\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration: 500  Loss: <built-in method item of Tensor object at 0x7efbcadf7438>  Accuracy: 96 %\n",
      "Iteration: 1000  Loss: <built-in method item of Tensor object at 0x7efbac7185a0>  Accuracy: 97 %\n",
      "Iteration: 1500  Loss: <built-in method item of Tensor object at 0x7efbac7185a0>  Accuracy: 97 %\n",
      "Iteration: 2000  Loss: <built-in method item of Tensor object at 0x7efbac713120>  Accuracy: 98 %\n"
     ]
    }
   ],
   "source": [
    "# CNN model training\n",
    "count = 0\n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "accuracy_list = []\n",
    "for epoch in range(num_epochs):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        \n",
    "        train = Variable(images.view(100,1,28,28))\n",
    "        labels = Variable(labels)\n",
    "        \n",
    "        # Clear gradients\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # Forward propagation\n",
    "        outputs = model(train)\n",
    "        \n",
    "        # Calculate softmax and ross entropy loss\n",
    "        loss = error(outputs, labels)\n",
    "        \n",
    "        # Calculating gradients\n",
    "        loss.backward()\n",
    "        \n",
    "        # Update parameters\n",
    "        optimizer.step()\n",
    "        count += 1\n",
    "        if count % 50 == 0:\n",
    "            # Calculate Accuracy         \n",
    "            correct = 0\n",
    "            total = 0\n",
    "            # Iterate through test dataset\n",
    "            for images, labels in test_loader:\n",
    "                \n",
    "                test = Variable(images.view(100,1,28,28))\n",
    "                \n",
    "                # Forward propagation\n",
    "                outputs = model(test)\n",
    "                \n",
    "                # Get predictions from the maximum value\n",
    "                predicted = torch.max(outputs.data, 1)[1]\n",
    "                \n",
    "                # Total number of labels\n",
    "                total += len(labels)\n",
    "                \n",
    "                correct += (predicted == labels).sum()\n",
    "            \n",
    "            accuracy = 100 * correct / float(total)\n",
    "            \n",
    "            # store loss and iteration\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "            accuracy_list.append(accuracy)\n",
    "            if count % 500 == 0:\n",
    "                # Print Loss\n",
    "                print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.data.item, accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualization loss \n",
    "plt.plot(iteration_list,loss_list)\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"CNN: Loss vs Number of iteration\")\n",
    "plt.show()\n",
    "\n",
    "# visualization accuracy \n",
    "plt.plot(iteration_list,accuracy_list,color = \"red\")\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.title(\"CNN: Accuracy vs Number of iteration\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Recurrent Neural Network (RNN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create RNN Model\n",
    "class RNNModel(nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):\n",
    "        super(RNNModel, self).__init__()\n",
    "        # Number of hidden dimensions\n",
    "        self.hidden_dim = hidden_dim\n",
    "        \n",
    "        # Number of hidden layers\n",
    "        self.layer_dim = layer_dim\n",
    "        \n",
    "        # RNN\n",
    "        self.rnn = nn.RNN(input_dim, hidden_dim, layer_dim, batch_first=True, \n",
    "                          nonlinearity='relu')\n",
    "        \n",
    "        # Readout layer\n",
    "        self.fc = nn.Linear(hidden_dim, output_dim)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        # Initialize hidden state with zeros\n",
    "        h0 = Variable(torch.zeros(self.layer_dim, x.size(0), self.hidden_dim))\n",
    "            \n",
    "        # One time step\n",
    "        out, hn = self.rnn(x, h0)\n",
    "        out = self.fc(out[:, -1, :]) \n",
    "        return out\n",
    "\n",
    "# batch_size, epoch and iteration\n",
    "batch_size = 100\n",
    "n_iters = 2500\n",
    "num_epochs = n_iters / (len(features_train) / batch_size)\n",
    "num_epochs = int(num_epochs)\n",
    "\n",
    "# Pytorch train and test sets\n",
    "train = torch.utils.data.TensorDataset(featuresTrain,targetsTrain)\n",
    "test = torch.utils.data.TensorDataset(featuresTest,targetsTest)\n",
    "\n",
    "# data loader\n",
    "train_loader = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = False)\n",
    "test_loader = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = False)\n",
    "    \n",
    "# Create RNN\n",
    "input_dim = 28    # input dimension\n",
    "hidden_dim = 100  # hidden layer dimension\n",
    "layer_dim = 2     # number of hidden layers\n",
    "output_dim = 10   # output dimension\n",
    "\n",
    "model = RNNModel(input_dim, hidden_dim, layer_dim, output_dim)\n",
    "\n",
    "# Cross Entropy Loss \n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "# SGD Optimizer\n",
    "learning_rate = 0.05\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration: 500  Loss: 2.258598804473877  Accuracy: 18 %\n",
      "Iteration: 1000  Loss: 0.8783552050590515  Accuracy: 70 %\n",
      "Iteration: 1500  Loss: 0.31326964497566223  Accuracy: 89 %\n",
      "Iteration: 2000  Loss: 0.34956154227256775  Accuracy: 89 %\n"
     ]
    }
   ],
   "source": [
    "seq_dim = 28  \n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "accuracy_list = []\n",
    "count = 0\n",
    "for epoch in range(num_epochs):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "\n",
    "        train  = Variable(images.view(-1, seq_dim, input_dim))\n",
    "        labels = Variable(labels )\n",
    "            \n",
    "        # Clear gradients\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # Forward propagation\n",
    "        outputs = model(train)\n",
    "        \n",
    "        # Calculate softmax and ross entropy loss\n",
    "        loss = error(outputs, labels)\n",
    "        \n",
    "        # Calculating gradients\n",
    "        loss.backward()\n",
    "        \n",
    "        # Update parameters\n",
    "        optimizer.step()\n",
    "        \n",
    "        count += 1\n",
    "        \n",
    "        if count % 250 == 0:\n",
    "            # Calculate Accuracy         \n",
    "            correct = 0\n",
    "            total = 0\n",
    "            # Iterate through test dataset\n",
    "            for images, labels in test_loader:\n",
    "                images = Variable(images.view(-1, seq_dim, input_dim))\n",
    "                \n",
    "                # Forward propagation\n",
    "                outputs = model(images)\n",
    "                \n",
    "                # Get predictions from the maximum value\n",
    "                predicted = torch.max(outputs.data, 1)[1]\n",
    "                \n",
    "                # Total number of labels\n",
    "                total += labels.size(0)\n",
    "                \n",
    "                correct += (predicted == labels).sum()\n",
    "            \n",
    "            accuracy = 100 * correct / float(total)\n",
    "            \n",
    "            # store loss and iteration\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "            accuracy_list.append(accuracy)\n",
    "            if count % 500 == 0:\n",
    "                # Print Loss\n",
    "                print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.data.item(), accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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Mb76KtXfF1bvvPwyfP11er9dO9h4Yzj44HlH+RtvDEstlW/cjeBEYGZW20cffbc+/4035tXnd+iQCvpTTkl/N9ssHfm3rswitTKjNrP6ffIJvPoqdOoEa6xRsYVTSXz5JUyYAOPGzSv0R4+GSZPmzdO5czrCP+yweY24nTvnVp9fDP6FmLUEc+bAgw/CddfBnXfCN9+k6a1apYTQtWtqjOzSZd7zrl1htdXSPC3VV1/B22+nwn7ixHl/a55//PG8eRdbLF2l06PHvAJ/001hhRVyCr50nAjMKtmbb8LgwTBsWDqKXX75dPlhz57wwQfzF3ojRsD776erWmq0aZOObutKEl26wCqrpAKyXM2cmQr6wkK+sLD/8MP552/bdt5n7d593vO114YNN4Qlliht/GXCicCs0nz5JdxyS0oAjz+eCuqePeHyy2HffVNhV5+ZM9NljHUVmv/6V90F55pr1p0kunZNV78Us4pk1ix4993vxlvz9/3355+/JrF17Zr2Re0zoZVXLu/ElhMnArNKEAFPPJEK/+HDU7cD3brBH/8IRx2VrktvjLZt03LdutX9fk1VSl3VKC++mBpRCy2xRP1JokuXdIbSUKKYPRvee6/+I/pJk+Y10EKqxlpjjbTunj2/eybT0qu6isSJwKycTZqUqn2GDEkNmksvDX36wLHHwrbbNv/R+JJLpnry9dev+/0vvqi/zv2pp2DatPnnX2aZ+QvrDh3mP8J/992UDGpIKal17Zrq6msf0Xfq5MbvIlAU1heWqe7du4cHr7eqMXMm3HVXOvp/4IF0RNyjRyr8Dz64vK9LnzZt/rOIwucTJqRqrVVXnf8ovvB5586pfx1rFpJeiIjuC5rPqdWsHESkSxcHD4Ybb4RPP01VIOefD8cckxozK0H79vOutqktIh39l6DvHGsaJwKzPE2dmgr+wYPTXatt28IBB6Sj/113bVn13ZKTQJlyIjArtdmz4f770zX/99yTrozp3h3694fDD0/16GYl5ERgVipjx6Yj/+uvh8mT06WXp56ajv433jjv6KyKORGYFdPnn8PNN6cE8PTTqaqnVy847rj01w2jVgacCMya29y58OijqfC/9dY02tT668Oll6bRplZZJe8IzebjRGDWXN5+G4YOTdf8T5gAyy4LRx+dqn623LJFdVJmLYsTgdmimDED7rgjNfw+/HC6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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualization loss \n",
    "plt.plot(iteration_list,loss_list)\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"RNN: Loss vs Number of iteration\")\n",
    "plt.show()\n",
    "\n",
    "# visualization accuracy \n",
    "plt.plot(iteration_list,accuracy_list,color = \"red\")\n",
    "plt.xlabel(\"Number of iteration\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.title(\"RNN: Accuracy vs Number of iteration\")\n",
    "plt.savefig('graph.png')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
